var mongodb = require('./db');
var markdown = require('markdown').markdown;

var Blog = function(blog){
	this.title = blog.title;
	this.name = blog.name;
	this.blog = blog.blog;
	this.tags = blog.tags;
};

module.exports = Blog;

//保存博客数据
Blog.prototype.save = function(callback){
	var date = new Date();
	var time = {
		date: date,
		year: date.getFullYear(),
		month: date.getFullYear()+'-'+(date.getMonth()+1),
		day: date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate(),
		minute: date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate()+" "+date.getHours()+":"
			+(date.getMinutes()<10?"0"+date.getMinutes():date.getMinutes()),
	};
	var blog = {
		name: this.name,
		title: this.title,
		time: time,
		blog: this.blog,
		tags: this.tags,
		reprintInfo:{},
		comments:[],
		pv: 0,
	}
	mongodb.open(function(err,db){
		if(err){
			return callback(err);
		}
		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close();
				return callback(err);
			}
			blogs.insert(blog,{safe:true},function(err){
				mongodb.close();
				if(err){
					return callback(err);
				}
				callback(null);
			});
		});
	});
};

//获取某个人博客及相关信息
Blog.getAll = function(name,callback){
	mongodb.open(function(err,db){
		if(err){
			return callback(err);
		}

		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close();
				callback(err);
			}
			query = {};
			if(name){
				query.name = name;
			}
			blogs.find(query).sort({time:-1}).toArray(function(err,rBlogs){
				mongodb.close();
				if(err){
					return callback(err);
				}
				rBlogs.forEach(function(rBlog){
					rBlog.blog = markdown.toHTML(rBlog.blog);
				})
				callback(null,rBlogs);//查询成功，以数组形式返回数据
			});
		});
	});
}
//根据作者、日期、题目获取一篇文章
Blog.getOne = function(params,callback){

	var query = {
		'name': params.name,
		'title': params.title,
		'time.day': params.day
	};

	mongodb.open(function(err,db){
		if(err){
			return callback(err);
		}
		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close();
				return callback(err);
			}
			blogs.findOne(query,function(err,rBlog){				
				if(err){
					mongodb.close();
					return callback(err);
				}
				//每次访问添加增加pv值
				if(rBlog){
					blogs.update(query,{$inc:{'pv':1}},function(err){
						mongodb.close();
						if(err){
							return callback(err);
						}
					});
				}
				//解析markdown为html
				rBlog.blog = markdown.toHTML(rBlog.blog);
				callback(null,rBlog);

			});
		});
	});
}
//返回原始发表内容（markdown格式的）
Blog.edit = function(params,callback){

	var query = {
		'name': params.name,
		'title': params.title,
		'time.day': params.day
	};

	mongodb.open(function(err,db){
		if(err){
			return callback(err);
		}
		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close();
				return callback(err);
			}
			blogs.findOne(query,function(err,rBlog){
				mongodb.close();
				if(err){
					return callback(err);
				}
				callback(null,rBlog);

			});
		});
	});
}
//删除一篇文章（根据name day title）
Blog.remove = function(params,callback){
	var query = {
		'name': params.name,
		'title': params.title,
		'time.day': params.day
	};

	mongodb.open(function(err,db){
		if(err){
			return callback(err);
		}
		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close();
				return callback(err);
			}
			 blogs.remove(query,{w:1},function(err){
			 	mongodb.close();
			 	if(err){
			 		return callback(err);
			 	}
			 	callback(null);
			 });
		});
	})
}
//更新一篇文章
Blog.update = function(params,blog,callback){
	var query = {
		'name': params.name,
		'title': params.title,
		'time.day': params.day,
	};
	mongodb.open(function(err,db){
		if(err){
			return callback(err);
		}
		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close();
				return callback(err);
			}
			blogs.update(query,{$set:{'blog':blog}},function(err){
				mongodb.close();
				if(err){
					return callback(err);
				}
				callback(null);
			});
		});
	});
}
//一次获取十篇文章
Blog.getTen = function(name,page,callback){
	mongodb.open(function(err,db){
		if(err){
			return callback(err)
		}
		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close()
				return callback(err);
			}
			var query = {};
			if(name){
				query.name = name;
			}
			//返回文章的总数total
			blogs.count(query,function(err,total){
				blogs.find(query,{skip:(page-1)*2,limit:2}).sort({time:-1}).toArray(function(err,blogs){
				mongodb.close();
				if(err){
					callback(err);
				}
				blogs.forEach(function(blogs){
					blogs.blog = markdown.toHTML(blogs.blog);
				});
				callback(null,blogs,total);
				});
			});
		});
	});
}
//返回所有文章存档信息
Blog.getArchive = function(callback){
	mongodb.open(function(err,db){
		if(err){
			return callback(err);
		}
		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close();
				return callback(err);
			}
			blogs.find({},{
				'name':1,
				'time':1,
				'title':1
			}).sort({'time':-1}).toArray(function(err,blogs){
				mongodb.close();
				if(err){
					return callback(err);
				}
				callback(null,blogs);
			});
		});
	});
}

Blog.getTags = function(callback){
	mongodb.open(function(err,db){
		if(err){
			return callback(err);
		}
		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close();
				return callback(err);
			}
			blogs.distinct("tags",function(err,blogs){
				mongodb.close();
				if(err){
					return  callback(err);
				}
				callback(null,blogs);
			});
		});
	});
}
Blog.getBlogByTag = function(tag,callback){
	console.log(tag);
	mongodb.open(function(err,db){
		if(err){
			return callback(err);
		}
		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close();
				return callback(err);
			}
			blogs.find({'tags':tag},{'name':1,'time':1,'title':1}).sort({time:-1}).toArray(function(err,blogs){
				mongodb.close();
				if(err){
					return callback(err);
				}
				callback(null,blogs);
			});
		});
	});
}
//检索博客
Blog.search = function(keyword,callback){
	mongodb.open(function(err,db){
		if(err){
			callback(err);
		}
		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close();
				return callback(err);
			}
			
			var pattern = new RegExp(keyword,'i');
			blogs.find({
				'title':pattern
			},{
				'name':1,
				'time':1,
				'title':1
			}).sort({time:-1}).toArray(function(err,blogs){
				mongodb.close();
				if(err){
					return callback(err);
				}
				callback(null,blogs);
			});
		});
	});
}
Blog.reprint = function(reprint_from,reprint_to,callback){
	console.log(JSON.stringify(reprint_from));
	mongodb.open(function(err,db){
		if(err){
			callback(err);
		}
		db.collection('blogs',function(err,blogs){
			if(err){
				mongodb.close();
				return callback(err);
			}
			blogs.findOne({
				'name':reprint_from.name,
				'time.day':reprint_from.day,
				'title':reprint_from.title,
			},function(err,blog){
				if(err){
					mongodb.close();
					return callback(err);
				}
				var myDate = new Date();
				var time = {
					date: myDate,
					year: myDate.getFullYear(),
					month: myDate.getFullYear()+'-'+(myDate.getMonth()+1),
					day: myDate.getFullYear()+'-'+(myDate.getMonth()+1)+'-'+myDate.getDate(),
					minute: myDate.getFullYear()+'-'+(myDate.getMonth()+1)+'-'+myDate.getDate()+" "+myDate.getHours()+":"
						+(myDate.getMinutes()<10?"0"+myDate.getMinutes():myDate.getMinutes()),
				};
				//console.log('name'+JSON.stringify(blog));
				delete blog._id;
				console.log("name"+blog.name);
				blog.name = reprint_to.name;
				blog.time = time;
				blog.title = (blog.title.search(/[转载]/)>-1)?blog.title:'[转载]'+blog.title;
				blog.comments = [];
				blog.reprintInfo = {'reprint_from':reprint_from};
				blog.pv = 0;

				//更新被转载的原文档的reprintInfo中的reprint_to
				blogs.update({
					'name':reprint_from.name,
					'time.day': reprint_from.day,
					'title': reprint_from.title,
				},{
					$push:{
						'reprintInfo.reprint_to':{
							'name':blog.name,
							'day':time.day,
							'title':blog.title,
						}
					}
				},function(err){
					if(err){
						mongodb.close();
						return callback(err);
					}
				});
				//将转载生成的副本存入数据库,并返回
				blogs.insert(blog,{safe:true},function(err,rBlog){
					mongodb.close();
					if(err){
						return callback(err);
					}
					console.log(JSON.stringify(rBlog.length));
					callback(null,rBlog.ops[0]);
				});
			});
		});
	});
}
